library(tidyverse)
## ── Attaching packages ────────────────────────────────────────────────────────────────── tidyverse 1.3.0 ──
## ✓ ggplot2 3.3.0     ✓ purrr   0.3.4
## ✓ tibble  3.0.1     ✓ dplyr   1.0.0
## ✓ tidyr   1.0.3     ✓ stringr 1.4.0
## ✓ readr   1.3.1     ✓ forcats 0.5.0
## ── Conflicts ───────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
library(jpeg)
library(grid)
ds9 <- readJPEG("wedding.jpg")
blue <- ds9[,,3]
m <- prcomp(blue, scale. = T)
grid.raster(ds9)

pca_approx <- function(data, pca_loadings, d){
  pca_loadings <- pca_loadings[, 1:d]
  out <- (data %*% pca_loadings) %*% t(pca_loadings)
}
blueout <- pca_approx(blue, m$rotation, 5)
blueout <- (blueout - min(blueout)) / max(blueout - min(blueout))
grid.raster(as.raster(blueout))

blueout <- pca_approx(blue, m$rotation, 600)
blueout <- (blueout - min(blueout)) / max(blueout - min(blueout))
grid.raster(as.raster(blueout))